/**
 * $Author: francesco.benincasa $
 * $Date: 2007-02-26 15:11:13 +0100 (lun, 26 feb 2007) $
 * $Rev: 488 $
 * 
 */
package org.stars.daostars;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.stars.daostars.core.DaoStars;
import org.stars.daostars.core.Profile;
import org.stars.daostars.core.Source;
import org.stars.daostars.loader.xml.DaoStarsXmlLoader;
import org.stars.util.FileUtility;

/**
 * Configuratore di daostars. Carica la configurazione di DaoStars.
 * 
 * @author Francesco Benincasa (908099)
 * 
 */
public class DaoConfigurator {

	// Private constructor prevents instantiation from other classes
	protected DaoConfigurator() {
		relativePath = "/WEB-INF/websecurity";
	}

	/**
	 * SingletonHolder is loaded on the first execution of
	 * Singleton.getInstance() or the first access to SingletonHolder.INSTANCE,
	 * not before.
	 */
	private static class DaoConfiguratorHolder {
		public static final DaoConfigurator INSTANCE = new DaoConfigurator();
	}

	public static DaoConfigurator getInstance() {
		return DaoConfiguratorHolder.INSTANCE;
	}
	
	/**
	 * Logger
	 * 
	 * @return logger
	 */
	protected Log getLog() {
		return LogFactory.getLog(DaoConfigurator.class);
	}

	/**
	 * istanza del configuratore
	 */
	protected static DaoConfigurator instance;

	/**
	 * percorso relativo. Viene aggiunto al path assoluto
	 */
	protected String relativePath;

	/**
	 * Imposta il display delle query in modalit� debug.
	 * 
	 * @param value
	 *            <code>true</code> per abilitare il debug delle query.
	 *            <code>false</code> altrimenti.
	 */
	public void setPrintMode(boolean value) {
		DaoBase.setGlobalPrintMode(value);
	}

	/**
	 * Restituisce <code>true</code> se la modalità debug delle query è
	 * abilitato.
	 * 
	 * @return <code>true</code> se il print mode è abilitato
	 */
	public boolean getPrintMode() {
		return DaoBase.isGlobalPrintMode();
	}

	/**
	 * A partire dal percorso specificato, carica la configurazione dei vari
	 * dao. I file di configurazione si devono trovare sotto la sottocartella
	 * daosql e deve avere i nomi dei rispettivi dao (es: DaoPersona.xml).
	 * 
	 * Il path deve finire con il carattere di separazione.
	 * 
	 * @param sPath
	 *            cartella dentro la quale si trova la cartella daosql con le
	 *            definizioni delle query sql.
	 * @return numero di definizioni di dao caricate per il profilo attivato
	 */
	public int loadConfigurationFromFile(String sPath) {
		Log log = getLog();

		try {
			long time = System.currentTimeMillis();
			String sBasePath = sPath;
			sBasePath = org.stars.util.FileUtility.adjustPath(sBasePath);
			DaoStars ds = DaoStars.getInstance();

			ds.reset(); // puliamo il daostars
			ds.setBasePath(sBasePath); // impostiamo il path di base di tutta
			// l'applicazione

			String sConfigFile = sPath + relativePath + "/" + "daostars.xml";
			sConfigFile = FileUtility.adjustPath(sConfigFile);

			// se esiste il file di configurazione lo utilizziamo
			// altrimenti andiamo con la configurazione di default.
			if (FileUtility.existsFile(sConfigFile)) {
				log.info("DaoStars configuration found in file daostars.xml");
				DaoStarsXmlLoader loader = new DaoStarsXmlLoader();
				loader.loadFile(sConfigFile);
			} else {
				// creiamo un profilo di default e vi mettiamo un source di
				// default
				ds.addProfile(new Profile());
				Source src = new Source();
				ds.getActiveProfile().addSource(src);
				log.info("DaoStars use default configuration (no config file used)");
			}

			// carichiamo le definizioni presenti solo nel profilo attivo
			ds.loadActiveProfile();
			int size = ds.getActiveProfile().getSqlMapperSet().size();

			if (size == 0) {
				log.warn("There are no source for the active profile!");
			}

			time = System.currentTimeMillis() - time;
			log.info("DaoStars Initialization Complete. Version " + DaoStars.getVersion() + " is loaded in " + time + " ms.");
			return ds.getActiveProfile().getSqlMapperSet().size();
		} catch (Exception e) {
			// visualizza l'errore
			log.fatal(e.toString());
			log.info("DaoStars Initialization FAILED. Version " + DaoStars.getVersion() + " IS NOT loaded.");
			return 0;
		}

	}

	/**
	 * @return the relativePath
	 */
	public String getRelativePath() {
		return relativePath;
	}

	/**
	 * @param relativePath
	 *            the relativePath to set
	 */
	public void setRelativePath(String relativePath) {
		this.relativePath = relativePath;
	}

}
